package com.zdp.netty.bytebuf;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
import io.netty.buffer.CompositeByteBuf;
import io.netty.buffer.Unpooled;
import org.junit.Test;

import java.nio.charset.Charset;

/**
 * 混合 ByteBuf缓冲区 （复用消息中的Header)
 * @author Zhengdp
 * @date 2022年12月22日 16:46
 */
public class CompositeBufferTest {
    private static Charset UTF8 = Charset.forName("UTF-8");

    @Test
    public void byteBufComposite(){
        // 1. 分配缓冲区
        CompositeByteBuf byteBufs = ByteBufAllocator.DEFAULT.compositeBuffer();
        // 设置消息头
        ByteBuf headerBuf = Unpooled.copiedBuffer("消息头测试",UTF8);
        // 设置消息体1
        ByteBuf body = Unpooled.copiedBuffer("消息体1测试",UTF8);
        byteBufs.addComponents(headerBuf,body);
        sendMsg(byteBufs);
        // 在引用计数为0前，retain
        headerBuf.retain();
        byteBufs.release();

        byteBufs = ByteBufAllocator.DEFAULT.compositeBuffer();
        // 设置消息体2
        body = Unpooled.copiedBuffer("消息体2测试",UTF8);
        byteBufs.addComponents(headerBuf,body);
        sendMsg(byteBufs);
        byteBufs.release();

    }

    private void sendMsg(CompositeByteBuf cbuf) {
        // 处理消息
        for (ByteBuf buf : cbuf) {
            int length = buf.readableBytes();
            byte[] array = new byte[length];
            // 将 CompositeByteBuf中的数据复制到数组中
            buf.getBytes(buf.readerIndex(),array);
            // 处理数组中数据
            System.out.println(new String(array,UTF8));
        }
        System.out.println();
    }
}
